package 代码记录.剑指offer错题本;

/**
 * @author zx
 * @create 2022-06-30 9:21
 */
public class 表示数值的字符串_20 {
    public boolean isNumber(String s) {
        boolean isNum = false, isDian = false, ise_or_E = false;//标记是否遇到数位、小数点、'e'或'E'
        char[] str = s.trim().toCharArray();
        for (int i = 0; i < str.length; i++) {
            if (str[i] >= '0' && str[i] <= '9') {
                isNum = true;
            } else if (str[i] == '.') {
                if (isDian || ise_or_E) {
                    return false;//小数点之前可以没有整数,但是不能重复出现小数点、或出现'e'、'E'
                }
                isDian = true;//标记已经遇到小数点
            } else if (str[i] == 'e' || str[i] == 'E') {
                if (!isNum || ise_or_E) {
                    return false;//'e'或'E'前面必须有整数,且前面不能重复出现'e'或'E'
                }
                ise_or_E = true;
                isNum = false;//重置isNum,因为'e'或'E'之后也必须接上整数,防止出现123e或者123e+的非法情况
            } else if (str[i] == '-' || str[i] == '+') {
                if (i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E') {
                    return false;//正负号只可能出现在第一个位置,或者出现在'e'或'E'的后面一个位置
                }
            } else {
                return false;//其它情况均为不合法字符
            }
        }
        return isNum;
    }
}
